/* 
 * EventoInsertUpdateRule.java
 * 
 * Data de criação: 06/09/2010
 * 
 * O2SOLUTIONS - SOLUÇÕES EM TECNOLOGIA DA INFORMAÇÃO. 
 *
 */
package br.com.o2solutions.siso.business.rule.evento;

import java.util.List;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import br.com.o2solutions.core.exception.BusinessException;
import br.com.o2solutions.core.integration.repository.DataBaseIntegration;
import br.com.o2solutions.core.service.rule.Rule;
import br.com.o2solutions.siso.integration.entidade.Evento;
import br.com.o2solutions.util.assertion.Assert;
import br.com.o2solutions.util.collection.CollectionUtil;

/**
 * Classe responsável por realizar a verificação de inclusão ou atualização de
 * um novo evento quanto a duplicidade da descricao.
 * 
 * @author Osvaldeir
 * @since 06/09/2010
 * 
 */
@Component("eventoInsertUpdateRule")
public class EventoInsertUpdateRule implements Rule<Evento> {

	@Value("#{eventoDAO}")
	private DataBaseIntegration<Evento> eventoDAO;

	/**
	 * {@inheritDoc}
	 * <p>
	 * O cadastro de Eventos com a mesma descrição é considerado uma quebra
	 * negocial, assim , será lançada uma {@link BusinessException} com a chave
	 * <b>error.evento.exists</b> informando a existência do Evento na base de
	 * dados.
	 * </p>
	 */
	@Override
	public void check(Evento entity) throws BusinessException {
		List<Evento> resultList = eventoDAO.findByNamedQuery(
				"Evento.findByDescricao", entity.getDescricao());
		resultList.remove(entity);
		Assert.isNull(CollectionUtil.getFirstObject(resultList),
				new BusinessException("Evento ja cadastrado",
						"error.evento.exists", entity.getDescricao()));
	}

}
